package com.rpframework.website.daole.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.rpframework.module.common.pay.alipay.config.AlipayConfig;
import com.rpframework.module.common.pay.alipay.util.SignUtils;
import com.rpframework.module.common.pay.wxpay.api.WXpayApi;
import com.rpframework.module.common.pay.wxpay.config.WXpayConfig;
import com.rpframework.module.common.pay.wxpay.util.WXpayCore;

/**
 * 
 * 支付基本信息
 * @author zhangli
 * @date 2016年3月28日 下午2:35:24
 * 
 * 
 * 1.需要支付的信息  ：
 * 		用户支付  支付相关业务 支付金额  回调业务
 * 2.第三方支付需要的信息：
 * 		trade_no,subject,body,total_fee,notify_url
 * 
 */
public class PayUtils {
	
	
	public static String sign(String content, String RSA_PRIVATE) {
		return SignUtils.sign(content, RSA_PRIVATE);
	}
	 /**
	  * 支付宝支付
	  * @param trade_no 订单号
	  * @param total_fee 金额
	  * @param subject 标题
	  * @param body 内容
	  * @param notify_url 回调地址
	  * @param callback
	  * @return
	 * @throws UnsupportedEncodingException 
	  */
	 public static @ResponseBody String AliPay(
			 @RequestParam(value = "trade_no",required = false ) String trade_no,//订单号
			 @RequestParam(value = "total_fee",required = false ) Double total_fee,//金额
			 @RequestParam(value = "subject",required = false ) String subject,//标题
			 @RequestParam(value = "body",required = false ) String body,//内容
			 @RequestParam(value = "notify_url",required = false ) String notify_url,//回调哪个方法
			 @RequestParam(value = "callback",required = false ) String callback
			 ) throws UnsupportedEncodingException{
		 JsonObject json = new JsonObject();
		 	DecimalFormat df = new DecimalFormat("######0.00");
//			json.addProperty("code", 200);//
//			json.addProperty("msg", "返回支付宝支付信息");//
//			json.addProperty("public_key", AlipayConfig.ali_public_key);//支付宝公钥
//			json.addProperty("private_key", AlipayConfig.private_key);//商户私钥
//			json.addProperty("partner", AlipayConfig.partner);//合作者PID
//			json.addProperty("seller_id", AlipayConfig.seller_email);//商户支付宝账号
//			
//			json.addProperty("_input_charset", AlipayConfig.input_charset);//字符编码 
//			json.addProperty("sign_type", "RSA");//加密方式 不用更改
//			json.addProperty("service", "mobile.securitypay.pay");//固定接口调用
//			json.addProperty("notify_url", AlipayConfig.notifyURL+notify_url);//回调服务端地址
		 	String orderInfo = "_input_charset=\"utf-8\"";
			orderInfo += "&body=" + "\"" + body + "\"";
			orderInfo += "&it_b_pay=\"30m\"";
			orderInfo += "&notify_url=" + "\"" + AlipayConfig.notifyURL+notify_url + "\"";
			orderInfo += "&out_trade_no=" + "\"" + trade_no + "\"";
			orderInfo += "&partner=" + "\"" + AlipayConfig.partner + "\"";
			orderInfo += "&payment_type=\"1\"";
			orderInfo += "&return_url=\"" + AlipayConfig.notifyURL+notify_url + "\"";
			orderInfo += "&seller_id=" + "\"" + AlipayConfig.seller_email + "\"";
			orderInfo += "&service=\"mobile.securitypay.pay\"";
			orderInfo += "&subject=" + "\"" + subject + "\"";
			String format = df.format((Object)total_fee);
			if(format.indexOf(",")>0)format = format.replace(",", ".");
			orderInfo += "&total_fee=" + "\"" + format+"\"";
			System.out.println(orderInfo);
			String sign = sign(orderInfo, AlipayConfig.private_key);
//		 	json.addProperty("out_trade_no",trade_no);//
//			json.addProperty("subject", subject);//
//			json.addProperty("body",body);//
//			json.addProperty("total_fee",df.format((Object)total_fee));//订单价格
			//json.add("info", getInfoJson());
			sign = URLEncoder.encode(sign, "utf-8");
			final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
					+ "sign_type=\"RSA\"";
		 json.addProperty("payInfo", payInfo);
		 return (callback + "(" + json + ")");
	 }
	 	/**
		 * 返回接口开发人员的字段备注信息
		 * @return
		 * @time 2016年3月28日 下午2:22:07
		 */
		public static JsonElement getInfoJson() {
			JsonObject json = new JsonObject();
			json.addProperty("public_key=","支付宝公钥");
			json.addProperty("private_key=","商户私钥");
			json.addProperty("partner=","合作者PID");
			json.addProperty("seller_id=","商户支付宝账号");
			
			json.addProperty("_input_charset=", "字符编码");
			json.addProperty("sign_type=", "加密方式 不用更改");
			json.addProperty("service=", "固定接口调用");
			json.addProperty("notify_url=", "回调服务端地址");
			
			json.addProperty("out_trade_no=", "支付宝合作商户唯一订单号Id");
			json.addProperty("subject=", "订单名服务名称");
			json.addProperty("body=", "服务名");
			json.addProperty("total_fee=", "服务价格");
			return json;
		}
		/**
		 * 微信支付
		 * @param trade_no 订单号
		 * @param total_fee 金额
		 * @param body 文字内容说明
		 * @param wxnotify 回调地址
		 * @param callback
		 */
		 public static @ResponseBody String WxPay(
				 @RequestParam(value = "trade_no",required = false ) String trade_no,
				 @RequestParam(value = "total_fee",required = false ) Double total_fee,
				 @RequestParam(value = "body",required = false ) String body,
				 @RequestParam(value = "notify_url",required = false ) String wxnotify,
				 @RequestParam(value = "callback",required = false ) String callback
				 ){
			 JsonObject json = new JsonObject();
			 System.out.println(" =============》预付款开始:");
			Double d = total_fee*100;
			Map<String, String> retMap = testUnifiedorder(trade_no,body,String.valueOf(d.intValue()),wxnotify);
	        System.out.println(" =============》预付款结束:");
	        System.out.println(WXpayCore.isRetSuccess(retMap)); // 判断统一下单（预支付）接口是否成功
	        if (WXpayCore.isRetSuccess(retMap)) {
	        	Map<String, String> appMap = WXpayApi.makePaymentMap(retMap);
	            // 预支付成功，组装真正支付需要的参数，返回给app使用
	            System.out.println(" =============》组装app使用参数:");
	            System.out.println(appMap);
	            json.addProperty("sign", appMap.get("sign"));
	            json.addProperty("timestamp", appMap.get("timestamp"));
	            json.addProperty("partnerid", appMap.get("partnerid"));
	            json.addProperty("noncestr", appMap.get("noncestr"));
	            json.addProperty("prepayid", appMap.get("prepayid"));
	            json.addProperty("appid", appMap.get("appid"));
	            json.addProperty("package", "Sign=WXPay");
	        } else {
	            System.out.println(WXpayCore.getErrMsg(retMap));
	        }
				//json.add("info", getInfoJson());
			 
			 return (callback + "(" + json + ")");
		 }
		 /**
		  * 微信支付组装app使用参数
		  * @param trade_no 订单号
		  * @param body 文字内容说明
		  * @param total_fee 金额
		  * @param wxnotify 回调地址
		  * @return
		  */
		 public static Map<String, String> testUnifiedorder(
				 String trade_no,
				 String body, 
				 String total_fee,
				 String wxnotify) {
		        Map<String, String> testMap = new HashMap<String, String>();
		       // testMap.put("device_info", "aaa"); // 设备号
		        testMap.put("body", body); // 商品描述
		       // testMap.put("detail", "离子水1，离子水2"); // 商品详情
		       // testMap.put("attach", "附加数据"); // 附加数据
		        testMap.put("out_trade_no", trade_no); // 商户订单号
		        testMap.put("total_fee", total_fee); // 总金额
		        testMap.put("spbill_create_ip", "192.168.0.1"); // 终端IP
		       // testMap.put("time_start", ""); // 交易起始时间
		       // testMap.put("time_expire", ""); // 交易结束时间

		      //  testMap.put("goods_tag", ""); // 商品标记
		        testMap.put("notify_url", WXpayConfig.notifyURL+wxnotify); // 通知地址
		        testMap.put("trade_type", "APP"); // 交易类型
		      //testMap.put("product_id", ""); // 商品ID
		      // testMap.put("openid", ""); // 用户标识
		        Map<String, String> retMap = WXpayApi.unifiedOrderRetMap(testMap);
		        return retMap;
		    }
		
}
